{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d016fec8",
   "metadata": {},
   "source": [
    "## 实验二  神经网络\n",
    "### 第1.1题  标准BP算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0f879dd4",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "#  Wine,数据预处理  \n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import LabelBinarizer, StandardScaler\n",
    "from sklearn.metrics import confusion_matrix, classification_report\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt \n",
    "\n",
    "#读数据\n",
    "wine = np.genfromtxt(\"wine_data-2.csv\", delimiter=\",\",skip_header=1)   #  二分类任务\n",
    "X = wine[:,0:13]\n",
    "y = wine[:,13]\n",
    "\n",
    "sc= StandardScaler()\n",
    "X_st=sc.fit_transform(X) # 对样本的各属性值进行准化\n",
    "\n",
    "x_train, x_test, y_train, y_test = train_test_split(X_st, y)    # 默认取出97个样本作为测试集，33个作为测试集\n",
    "# print(x_train.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "4937efcb",
   "metadata": {},
   "outputs": [],
   "source": [
    "rate = 0.01    #学习率\n",
    "# 以13个特征值作为输入，1个神经元作为输出（输出>=0.5为1类，<0.5为0类），中间隐藏层50个神经元\n",
    "v = np.random.random((13, 100)) * 2 - 1\n",
    "w = np.random.random((50, 3)) * 2 - 1\n",
    "\n",
    "label_train = LabelBinarizer().fit_transform(y_train)\n",
    "# print(label_train)\n",
    "label_test = LabelBinarizer().fit_transform(y_test)\n",
    "# print(label_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "0cbba844",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义激活函数\n",
    "def sigmoid(x):\n",
    "    return 1 / (1 + np.exp(-x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "0995d1da",
   "metadata": {},
   "outputs": [],
   "source": [
    "#激活函数的导数\n",
    "def d_sigmoid(x):\n",
    "    return x * (1 - x)    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "6b811749",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAYAAABB4NqyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABHsklEQVR4nO3de3wU9b3/8ffuJtnNPZCQhEsgXCKIICCXGFChNRoq1WLtESk/QWr12AMqRlFBAS/HBhU8iFA5emqxrQjVClovWIyIpUSQm4goKCJBYBMQyJIEctmd3x9JFtaEkPvsJq/n47GP7M58Z/YzA5K33/nOdyyGYRgCAABoQ6xmFwAAANDSCEAAAKDNIQABAIA2hwAEAADaHAIQAABocwhAAACgzSEAAQCANifI7AL8kcfj0aFDhxQZGSmLxWJ2OQAAoA4Mw9DJkyfVqVMnWa219/EQgGpw6NAhJSUlmV0GAABogAMHDqhLly61tiEA1SAyMlJSxQmMiooyuRoAAFAXLpdLSUlJ3t/jtSEA1aDqsldUVBQBCACAAFOX4SsMggYAAG0OAQgAALQ5BCAAANDmMAYIAOD33G63ysrKzC4DJgsODpbNZmuSfRGAAAB+yzAMOZ1OnThxwuxS4CdiYmKUmJjY6Hn6CEAAAL9VFX7i4+MVFhbG5LRtmGEYKi4uVn5+viSpY8eOjdofAQgA4Jfcbrc3/MTGxppdDvxAaGioJCk/P1/x8fGNuhzGIGgAgF+qGvMTFhZmciXwJ1V/Hxo7JowABADwa1z2wtma6u8DAQgAALQ5BCAAANDmEIAAAGilRo0apWnTpgXcvlsCAaiFlbs9KiopN7sMAIAJbrnlFo0dO9bsMlrE0qVLZbFYvK+IiAgNHjxYb7zxhk+7UaNGeds4HA717dtXf/jDH5q9PgJQCyopd+vqBR/rojnv6/KnPtTMlZ9r3Z4jMgzD7NIAAKjGMAyVlzf8f9qjoqJ0+PBhHT58WNu2bVNGRoZuvPFG7d6926fdbbfdpsOHD2vXrl268cYbNWXKFL366quNLb9WBKAW9I/PDuvbI0WSpAPHTmnZxlxNemmTfvbsv/TJtz+YXB0A+DfDMFRcWm7Kqz7/o/r666+rf//+Cg0NVWxsrNLT01VUVKRHHnlEL7/8st58801vj8dHH30kSXrggQd0wQUXKCwsTD169NCsWbN8bvN+5JFHNHDgQP3lL39RcnKyoqOjddNNN+nkyZPeNkVFRZo4caIiIiLUsWNHzZ8/v1ptf/nLXzRkyBBFRkYqMTFRv/71r70TC0rSRx99JIvFovfee0+DBw+W3W7X+vXr67TvmlgsFiUmJioxMVEpKSn67//+b1mtVu3YscOnXVhYmBITE9WjRw898sgjSklJ0VtvvVXnc94QTITYgpwFpxRis2ryiGRd2iNW2V/ladW2Q/rKeVLjX/xEc37eV7eM6G52mQDgl06VudV39vumfPeuxzIUFnL+X5mHDx/W+PHj9dRTT+n666/XyZMn9a9//UuGYei+++7Tl19+KZfLpT/96U+SpPbt20uSIiMjtXTpUnXq1Emff/65brvtNkVGRur+++/37nvv3r1atWqV3n77bR0/flw33nij5s6dqyeeeEKSNH36dK1bt05vvvmm4uPjNXPmTG3dulUDBw707qOsrEyPP/64evfurfz8fGVmZuqWW27Ru+++63McDz74oObNm6cePXqoXbt2ddr3+bjdbv35z3+WJF1yySW1tg0NDVVpaWmd990QBKAWNPWnKRo3tKvswVZFOYL1kz7xmn51Hz3x7i79bfP3euQfuxQdFqzrB3Uxu1QAQAMcPnxY5eXl+uUvf6lu3bpJkvr37+9dHxoaqpKSEiUmJvps9/DDD3vfJycn67777tPy5ct9ApDH49HSpUsVGRkpSbr55puVnZ2tJ554QoWFhfrjH/+ov/71r7ryyislSS+//LK6dPH9ffKb3/zG+75Hjx5auHChhg4dqsLCQkVERHjXPfbYY7rqqqskqc77rklBQYF3v6dOnVJwcLBeeOEF9ezZs8b2brdbr776qnbs2KHbb7/9vPtvDAJQC+sQaff5HB0WrCdvuFjtwkL0vx9/q4dW7tTgru3VNZaZTwHgbKHBNu16LMO0766LAQMG6Morr1T//v2VkZGhq6++Wr/61a/Url27WrdbsWKFFi5cqL1796qwsFDl5eWKioryaZOcnOwNP1LFs7CqLl/t3btXpaWlSk1N9a5v3769evfu7bOPLVu26JFHHtFnn32m48ePy+PxSJJyc3PVt29fb7shQ4Z439d13zWJjIzU1q1bJUnFxcX64IMPdMcddyg2NlbXXnutt90f/vAH/d///Z9KS0tls9l0zz336He/+915998YjAHyAxaL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ueYao2vXrkZhYaG3zR133GEkJSUZ2dnZxubNm41LL73UGD58uHd9eXm50a9fPyM9Pd3Ytm2b8e677xpxcXHGjBkzzDgkv7dp0yYjOTnZuPjii427777bu5zz3DSOHTtmdOvWzbjllluMjRs3Gt9++63x/vvvG9988423zdy5c43o6Ghj1apVxmeffWZcd911Rvfu3Y1Tp05524wePdoYMGCA8cknnxj/+te/jF69ehnjx48345D80hNPPGHExsYab7/9trFv3z7jtddeMyIiIoxnn33W24bzXH/vvvuu8dBDDxlvvPGGIclYuXKlz/qmOKcFBQVGQkKCMWHCBGPnzp3Gq6++aoSGhhr/+7//2yTHQABqIcOGDTOmTJni/ex2u41OnToZWVlZJlYVuPLz8w1Jxrp16wzDMIwTJ04YwcHBxmuvveZt8+WXXxqSjJycHMMwKv6DtVqthtPp9LZ5/vnnjaioKKOkpKRlD8DPnTx50khJSTHWrFljjBw50huAOM9N54EHHjAuu+yyc673eDxGYmKi8fTTT3uXnThxwrDb7carr75qGIZh7Nq1y5BkfPrpp9427733nmGxWIyDBw82X/EBZMyYMcZvfvMbn2W//OUvjQkTJhiGwXluCj8OQE11Tv/whz8Y7dq18/l344EHHjB69+7dJHVzCawFlJaWasuWLUpPT/cus1qtSk9PV05OjomVBa6CggJJUvv27SVJW7ZsUVlZmc857tOnj7p27eo9xzk5Oerfv78SEhK8bTIyMuRyufTFF1+0YPX+b8qUKRozZozP+ZQ4z03prbfe0pAhQ/Qf//Efio+P16BBg/Tiiy961+/bt09Op9PnXEdHRys1NdXnXMfExGjIkCHeNunp6bJardq4cWPLHYwfGz58uLKzs7Vnzx5J0meffab169frZz/7mSTOc3NoqnOak5OjK664QiEhId42GRkZ2r17t44fP97oOnkYags4evSo3G63zy8ESUpISNBXX31lUlWBy+PxaNq0aRoxYoT69esnSXI6nQoJCVFMTIxP24SEBDmdTm+bmv4MqtahwvLly7V161Z9+umn1dZxnpvOt99+q+eff16ZmZmaOXOmPv30U911110KCQnRpEmTvOeqpnN59rmOj4/3WR8UFKT27dtzris9+OCDcrlc6tOnj2w2m9xut5544glNmDBBkjjPzaCpzqnT6VT37t2r7aNqXbt27RpVJwEIAWfKlCnauXOn1q9fb3Yprc6BAwd09913a82aNXI4HGaX06p5PB4NGTJEv//97yVJgwYN0s6dO7VkyRJNmjTJ5Opaj7/97W965ZVXtGzZMl100UXavn27pk2bpk6dOnGe2zgugbWAuLg42Wy2anfK5OXlKTEx0aSqAtPUqVP19ttva+3aterSpYt3eWJiokpLS3XixAmf9mef48TExBr/DKrWoeISV35+vi655BIFBQUpKChI69at08KFCxUUFKSEhATOcxPp2LGj+vbt67PswgsvVG5urqQz56q2fzcSExOVn5/vs768vFzHjh3jXFeaPn26HnzwQd10003q37+/br75Zt1zzz3KysqSxHluDk11Tpv73xICUAsICQnR4MGDlZ2d7V3m8XiUnZ2ttLQ0EysLHIZhaOrUqVq5cqU+/PDDat2igwcPVnBwsM853r17t3Jzc73nOC0tTZ9//rnPf3Rr1qxRVFRUtV9EbdWVV16pzz//XNu3b/e+hgwZogkTJnjfc56bxogRI6pN5bBnzx5169ZNktS9e3clJib6nGuXy6WNGzf6nOsTJ05oy5Yt3jYffvihPB6PUlNTW+Ao/F9xcbGsVt9fdTabTR6PRxLnuTk01TlNS0vTxx9/rLKyMm+bNWvWqHfv3o2+/CWJ2+BbyvLlyw273W4sXbrU2LVrl3H77bcbMTExPnfK4Nx+97vfGdHR0cZHH31kHD582PsqLi72trnjjjuMrl27Gh9++KGxefNmIy0tzUhLS/Our7o9++qrrza2b99urF692ujQoQO3Z5/H2XeBGQbnuals2rTJCAoKMp544gnj66+/Nl555RUjLCzM+Otf/+ptM3fuXCMmJsZ48803jR07dhi/+MUvaryVeNCgQcbGjRuN9evXGykpKW369uwfmzRpktG5c2fvbfBvvPGGERcXZ9x///3eNpzn+jt58qSxbds2Y9u2bYYk45lnnjG2bdtm7N+/3zCMpjmnJ06cMBISEoybb77Z2Llzp7F8+XIjLCyM2+AD0XPPPWd07drVCAkJMYYNG2Z88sknZpcUMCTV+PrTn/7kbXPq1Cnjv/7rv4x27doZYWFhxvXXX28cPnzYZz/fffed8bOf/cwIDQ014uLijHvvvdcoKytr4aMJLD8OQJznpvOPf/zD6Nevn2G3240+ffoYL7zwgs96j8djzJo1y0hISDDsdrtx5ZVXGrt37/Zp88MPPxjjx483IiIijKioKGPy5MnGyZMnW/Iw/JrL5TLuvvtuo2vXrobD4TB69OhhPPTQQz63VnOe62/t2rU1/ps8adIkwzCa7px+9tlnxmWXXWbY7Xajc+fOxty5c5vsGCyGcdZ0mAAAAG0AY4AAAECbQwACAABtDgEIAAC0OQQgAADQ5hCAAABAm0MAAgAAbQ4BCAAAtDkEIAAA0OYQgACYbtSoUZo2bZrZZfiwWCxatWqV2WUAaCbMBA3AdMeOHVNwcLAiIyOVnJysadOmtVggeuSRR7Rq1Spt377dZ7nT6VS7du1kt9tbpA4ALSvI7AIAoH379k2+z9LSUoWEhDR4+8TExCasBoC/4RIYANNVXQIbNWqU9u/fr3vuuUcWi0UWi8XbZv369br88ssVGhqqpKQk3XXXXSoqKvKuT05O1uOPP66JEycqKipKt99+uyTpgQce0AUXXKCwsDD16NFDs2bNUllZmSRp6dKlevTRR/XZZ595v2/p0qWSql8C+/zzz/XTn/5UoaGhio2N1e23367CwkLv+ltuuUVjx47VvHnz1LFjR8XGxmrKlCne7wLgXwhAAPzGG2+8oS5duuixxx7T4cOHdfjwYUnS3r17NXr0aN1www3asWOHVqxYofXr12vq1Kk+28+bN08DBgzQtm3bNGvWLElSZGSkli5dql27dunZZ5/Viy++qP/5n/+RJI0bN0733nuvLrroIu/3jRs3rlpdRUVFysjIULt27fTpp5/qtdde0wcffFDt+9euXau9e/dq7dq1evnll7V06VJvoALgX7gEBsBvtG/fXjabTZGRkT6XoLKysjRhwgTvuKCUlBQtXLhQI0eO1PPPPy+HwyFJ+ulPf6p7773XZ58PP/yw931ycrLuu+8+LV++XPfff79CQ0MVERGhoKCgWi95LVu2TKdPn9af//xnhYeHS5IWLVqka6+9Vk8++aQSEhIkSe3atdOiRYtks9nUp08fjRkzRtnZ2brtttua5PwAaDoEIAB+77PPPtOOHTv0yiuveJcZhiGPx6N9+/bpwgsvlCQNGTKk2rYrVqzQwoULtXfvXhUWFqq8vFxRUVH1+v4vv/xSAwYM8IYfSRoxYoQ8Ho92797tDUAXXXSRbDabt03Hjh31+eef1+u7ALQMAhAAv1dYWKj//M//1F133VVtXdeuXb3vzw4okpSTk6MJEybo0UcfVUZGhqKjo7V8+XLNnz+/WeoMDg72+WyxWOTxeJrluwA0DgEIgF8JCQmR2+32WXbJJZdo165d6tWrV732tWHDBnXr1k0PPfSQd9n+/fvP+30/duGFF2rp0qUqKiryhqx///vfslqt6t27d71qAuAfGAQNwK8kJyfr448/1sGDB3X06FFJFXdybdiwQVOnTtX27dv19ddf680336w2CPnHUlJSlJubq+XLl2vv3r1auHChVq5cWe379u3bp+3bt+vo0aMqKSmptp8JEybI4XBo0qRJ2rlzp9auXas777xTN998s/fyF4DAQgAC4Fcee+wxfffdd+rZs6c6dOggSbr44ou1bt067dmzR5dffrkGDRqk2bNnq1OnTrXu67rrrtM999yjqVOnauDAgdqwYYP37rAqN9xwg0aPHq2f/OQn6tChg1599dVq+wkLC9P777+vY8eOaejQofrVr36lK6+8UosWLWq6AwfQopgJGgAAtDn0AAEAgDaHAAQAANocAhAAAGhzCEAAAKDNIQABAIA2hwAEAADaHAIQAABocwhAAACgzSEAAQCANocABAAA2hwCEAAAaHP+P63MVRNPrA3XAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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esMNx9h/nnzySeOGG2644Ocej8dITEw0XnrpJe+yY8eOGU6n03jrrbcMwzCMb7/91pBkfPnll942H374oWGz2Yz9+/cHrvgQMmDAAOP+++/3Wfbzn//cGDJkiGEYHGd/OT/c+Ou4/vGPfzSaNGni82/Hk08+aVxxxRW1rplhqVoqKirShg0blJqa6l1mt9uVmpqqrKwsEysLbfn5+ZKkpk2bSpI2bNig4uJin+PcoUMHtWnTxnucs7KydM011yghIcHbJi0tTS6XS998800Qq6/bRo0apQEDBvgcS4lj7E///Oc/1aNHD919992Kj49X165dNW/ePO/nu3btUk5Ojs+xjo2NVa9evXyOdePGjdWjRw9vm9TUVNntdn3xxRfB+zJ12PXXX6/MzExt375dkvTVV19pzZo1uu222yRxnAPFX8c1KytLP/nJTxQREeFtk5aWpm3btunHH3+sVY317saZ/nbkyBG53W6ff+wlKSEhQd99951JVYU2j8ej8ePHq3fv3urYsaMkKScnRxEREWrcuLFP24SEBOXk5HjbVPR3KPsM0uLFi7Vx40Z9+eWX5T7jGPvPDz/8oDlz5ig9PV1PPfWUvvzyS40dO1YREREaPny491hVdCzPPdbx8fE+n4eFhalp06Yc6zMmTJggl8ulDh06yOFwyO126/nnn9eQIUMkieMcIP46rjk5OWrbtm25bZR91qRJkxrXSLhBnTNq1Cht2bJFa9asMbsUS9m3b5/GjRunlStXKjIy0uxyLM3j8ahHjx564YUXJEldu3bVli1bNHfuXA0fPtzk6qzj73//u958800tWrRIV199tbKzszV+/Hi1bNmS41zPMSxVS3FxcXI4HOXOKMnNzVViYqJJVYWu0aNH67333tOqVavUunVr7/LExEQVFRXp2LFjPu3PPc6JiYkV/h3KPqvvNmzYoEOHDqlbt24KCwtTWFiYPv74Y7366qsKCwtTQkICx9hPWrRooauuuspn2ZVXXqm9e/dKOnusKvt3IzExUYcOHfL5vKSkRHl5eRzrM37zm99owoQJ+sUvfqFrrrlGQ4cO1aOPPqqMjAxJHOdA8ddxDeS/J4SbWoqIiFD37t2VmZnpXebxeJSZmamUlBQTKwsthmFo9OjReuedd/TRRx+V66rs3r27wsPDfY7ztm3btHfvXu9xTklJ0ebNm33+h1q5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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试精度acc = 1.0\n",
      "[[14  0]\n",
      " [ 0 19]]\n"
     ]
    }
   ],
   "source": [
    "# 训练\n",
    "def train(x, y,outputs_dim=3,eta=0.05,max_iter=1000):#eta 才是学习率\n",
    "#   outputs_dim  输出层神经元个数\n",
    "    hiden_dim=50  # 隐层神经元个数\n",
    "    \n",
    "    #定义权重\n",
    "    w1 = np.zeros((x.shape[1],hiden_dim))  #  （13，50）<--- 矩阵维数\n",
    "    b1 = np.zeros((1,hiden_dim))  #  （1，50）\n",
    "    w2 = np.zeros((hiden_dim,1))  #  （50，1）\n",
    "    b2 = np.zeros((outputs_dim,1))  #  1 X 1\n",
    "    \n",
    "    losslist = []    #损失列表\n",
    "    mse_list = []\n",
    "    acc_list = []\n",
    "    for ite in range(max_iter):\n",
    "        loss_per_ite = []\n",
    "        for m in range(x.shape[0]):   # 遍历样本\n",
    "            xi,yi = x[m,:],y[m,:]\n",
    "\n",
    "            xi,yi = xi.reshape(1,xi.shape[0]),yi.reshape(1,yi.shape[0])\n",
    "\n",
    "            ##前向传播   \n",
    "            u1 = np.dot(xi,w1)+b1    \n",
    "            out1 = sigmoid(u1)    # 隐含层的输出  1 X 50\n",
    "            \n",
    "            u2 = np.dot(out1,w2)+b2   # (1,50) X (50，1) =（1,1）\n",
    "            out2 = sigmoid(u2)    #输出(激活)层的输出,（1,1）\n",
    "            \n",
    "            loss = np.square(yi - out2)/2\n",
    "            loss_per_ite.append(loss)\n",
    "#             print(\"iter:\",ite,\" loss:\",loss)\n",
    "\n",
    "            ##反向传播\n",
    "            ##标准BP\n",
    "            d_out2 = -(yi - out2)   # （1,1）         \n",
    "            d_u2 = d_out2*d_sigmoid(out2)   #  gj ,（1,1） zhouzhihua   jqxx(机器学习)  P103  \n",
    "            \n",
    "            d_w2 = np.dot(np.transpose(out1),d_u2)  # delta(whj)，(50，1), np.transpose()--矩阵转置\n",
    "            d_b2 = d_u2    # delta(thetaj),(1, 1)\n",
    "            \n",
    "            d_out1 = d_u2*w2 #  3E/3bh   zhouzhihua   jqxx(机器学习)  P103  (1,1) 点乘 (50，1) ---> (50,1)\n",
    "            \n",
    "            d_u1 = np.transpose(d_out1)*d_sigmoid(out1)    #  -eh    d_out1: (50, 1) , out1: 1 X 50 ，改成矩阵点乘            \n",
    "            #  shapes (13,1) and (1,50) --->  (13 , 50)\n",
    "            d_w1 = np.dot(np.transpose(xi),d_u1)   # delta(vih)        \n",
    "            d_b1 = d_u1  # delta(rh)  (1 , 50) \n",
    "            ##更新权重\n",
    "            w1 = w1 - eta*d_w1\n",
    "            w2 = w2 - eta*d_w2\n",
    "            b1 = b1 - eta*d_b1\n",
    "            b2 = b2 - eta*d_b2   \n",
    "        losslist.append(np.mean(loss_per_ite))\n",
    "        # 在训练循环中，每轮结束后计算并记录当前的均方误差和准确率\n",
    "        mse = np.mean(loss_per_ite) # 均方误差等于每个样本的损失平均值\n",
    "        mse_list.append(mse) # 将均方误差添加到列表中\n",
    "        test_label_list1 = []    #损失列表\n",
    "        for m in range(x_test.shape[0]):\n",
    "            xi,yi = x_test[m,:],label_test[m,:]\n",
    "            xi,yi = xi.reshape(1,xi.shape[0]),yi.reshape(1,yi.shape[0])\n",
    "            ##前向传播   \n",
    "            u1 = np.dot(xi,w1)+b1\n",
    "            out1 = sigmoid(u1)    # 隐含层的输出  1 X 50\n",
    "            u2 = np.dot(out1,w2)+b2\n",
    "            out2 = sigmoid(u2)    #激活层    \n",
    "            if out2>=0.5:\n",
    "                test_label_list1.append(1)\n",
    "            else: \n",
    "                test_label_list1.append(0)\n",
    "        re1=0  # 记录测试正确的样本数\n",
    "\n",
    "        # 计算测试精度\n",
    "        for i in range(len(y_test)):\n",
    "            if test_label_list1[i]==y_test[i]:\n",
    "                re1=re1+1\n",
    "            else:\n",
    "                pass\n",
    "        acc = re1 / len(y_test) # 准确率等于正确分类的样本数除以总样本数\n",
    "        acc_list.append(acc) # 将准确率添加到列表中\n",
    "        \n",
    "    ##Loss可视化，损失函数曲线\n",
    "    plt.figure()\n",
    "    plt.plot([i+1 for i in range(max_iter)],losslist)\n",
    "    plt.legend(['standard BP'])\n",
    "    plt.xlabel('iteration')\n",
    "    plt.ylabel('loss')\n",
    "    plt.show()\n",
    "    plt.figure()\n",
    "    plt.plot([i + 1 for i in range(max_iter)], mse_list, label='MSE') # 绘制均方误差曲线，横轴为训练轮数，纵轴为均方误差，标签为'MSE'\n",
    "    plt.plot([i + 1 for i in range(max_iter)], acc_list, label='ACC') # 绘制准确率曲线，横轴为训练轮数，纵轴为准确率，标签为'ACC'\n",
    "    plt.legend() # 显示图例\n",
    "    plt.xlabel('iteration') # 设置横轴标签为'iteration'\n",
    "    plt.ylabel('metric') # 设置纵轴标签为'metric'\n",
    "    plt.show() # 显示图像\n",
    "    return w1,w2,b1,b2\n",
    "\n",
    "######### 训练神经网络 #########\n",
    "w1,w2,b1,b2 = train(x_train,label_train,1)    # 成功训练\n",
    "test_label_list = []    #损失列表\n",
    "for m in range(x_test.shape[0]):\n",
    "    xi,yi = x_test[m,:],label_test[m,:]\n",
    "    xi,yi = xi.reshape(1,xi.shape[0]),yi.reshape(1,yi.shape[0])\n",
    "    ##前向传播   \n",
    "    u1 = np.dot(xi,w1)+b1\n",
    "    out1 = sigmoid(u1)    # 隐含层的输出  1 X 50\n",
    "    u2 = np.dot(out1,w2)+b2\n",
    "    out2 = sigmoid(u2)    #激活层    \n",
    "    if out2>=0.5:\n",
    "        test_label_list.append(1)\n",
    "    else: \n",
    "        test_label_list.append(0)\n",
    "\n",
    "re=0  # 记录测试正确的样本数\n",
    "\n",
    "# 计算测试精度\n",
    "for i in range(len(y_test)):\n",
    "    if test_label_list[i]==y_test[i]:\n",
    "        re=re+1\n",
    "    else:\n",
    "        pass\n",
    "\n",
    "# 计算、输出测试精度\n",
    "acc= re/len(y_test)\n",
    "print(\"测试精度acc =\",acc) \n",
    "# 导入confusion_matrix函数\n",
    "from sklearn.metrics import confusion_matrix\n",
    "# 计算混淆矩阵\n",
    "cm = confusion_matrix(y_test, test_label_list)\n",
    "# 打印混淆矩阵\n",
    "print(cm)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:pytorch]",
   "language": "python",
   "name": "conda-env-pytorch-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
